#include <stdio.h>  
#include <stdlib.h>  
  
// 表达式节点类型  
typedef enum {  
    NUM,  // 数字  
    ADD,  // 加法  
    MUL   // 乘法  
} ExprType;  
  
// 表达式节点的结构体  
typedef struct Expr {  
    ExprType type;  
    union {  
        int num;  
        struct {  
            struct Expr *left;  
            struct Expr *right;  
        } binary;  
    } u;  
  
    // 解释执行函数指针  
    int (*interpret)(struct Expr*);  
} Expr;  
  
// 解释执行数字节点  
int interpretNum(Expr *expr) {  
    return expr->u.num;  
}  
  
// 解释执行加法节点  
int interpretAdd(Expr *expr) {  
    return expr->u.binary.left->interpret(expr->u.binary.left) +  
           expr->u.binary.right->interpret(expr->u.binary.right);  
}  
  
// 解释执行乘法节点  
int interpretMul(Expr *expr) {  
    return expr->u.binary.left->interpret(expr->u.binary.left) *  
           expr->u.binary.right->interpret(expr->u.binary.right);  
}  
  
// 辅助函数：创建表达式节点  
Expr* createNum(int num) {  
    Expr *expr = (Expr *)malloc(sizeof(Expr));  
    expr->type = NUM;  
    expr->u.num = num;  
    expr->interpret = interpretNum;  
    return expr;  
}  
  
Expr* createBinary(ExprType type, Expr *left, Expr *right) {  
    Expr *expr = (Expr *)malloc(sizeof(Expr));  
    expr->type = type;  
    expr->u.binary.left = left;  
    expr->u.binary.right = right;  
    switch (type) {  
        case ADD:  
            expr->interpret = interpretAdd;  
            break;  
        case MUL:  
            expr->interpret = interpretMul;  
            break;  
        default:  
            free(expr);  
            return NULL;  
    }  
    return expr;  
}  
  
// 测试函数  
int main() {  
    Expr *expr = createBinary(ADD,  
        createBinary(MUL, createNum(3), createNum(4)),  
        createNum(2));  
  
    printf("Result: %d\n", expr->interpret(expr));  
  
    // 清理内存（实际使用中应实现更完整的内存管理）  
    // ...  
  
    return 0;  
}